home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 25 / AACD 25.iso / AACD / Magazine / Online / QMail / source / alloc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-04-15  |  833 b   |  33 lines

  1. #include "alloc.h"
  2. #include "error.h"
  3. extern char *malloc();
  4. extern void free();
  5.  
  6. #define ALIGNMENT 16 /* XXX: assuming that this alignment is enough */
  7. #define SPACE 4096 /* must be multiple of ALIGNMENT */
  8.  
  9. typedef union { char irrelevant[ALIGNMENT]; double d; } aligned;
  10. static aligned realspace[SPACE / ALIGNMENT];
  11. #define space ((char *) realspace)
  12. static unsigned int avail = SPACE; /* multiple of ALIGNMENT; 0<=avail<=SPACE */
  13.  
  14. /*@null@*//*@out@*/char *alloc(n)
  15. unsigned int n;
  16. {
  17.   char *x;
  18.   n = ALIGNMENT + n - (n & (ALIGNMENT - 1)); /* XXX: could overflow */
  19.   if (n <= avail) { avail -= n; return space + avail; }
  20.   x = malloc(n);
  21.   if (!x) errno = error_nomem;
  22.   return x;
  23. }
  24.  
  25. void alloc_free(x)
  26. char *x;
  27. {
  28.   if (x >= space)
  29.     if (x < space + SPACE)
  30.       return; /* XXX: assuming that pointers are flat */
  31.   free(x);
  32. }
  33.